{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 21 - 元学习器\n",
    " \n",
    " \n",
    "回顾一下，我们现在有兴趣寻找干预效果的异质性，即确定个体对干预的不同反应。在这个框架中，我们要估计\n",
    " \n",
    "$\n",
    "\\tau(x) = E[Y_i(1) − Y_i(0)|X] = E[\\tau_i|X]\n",
    "$\n",
    " \n",
    "或者，连续的情况下的$E[\\delta Y_i(t)|X]$。换句话说，我们想知道个体对干预的敏感程度。这在我们无法对所有人进行干预并需要对干预进行优先排序的情况下非常有用，例如，当您想提供折扣但预算有限时。\n",
    " \n",
    "之前，我们看到了如何转换结果变量 $Y$，以便我们可以将其插入预测模型并获得条件平均干预效果 (CATE) 估计。在那里，我们不得不付出方差增加的代价。这是我们在数据科学中经常看到的情况。没有一种最好的方法，因为每种方法都有其缺点和优点。出于这个原因，值得学习许多技术，这样您就可以根据情况权衡取舍。本着这种精神，本章将着重于提供更多工具供您使用。\n",
    " \n",
    "![img](data/img/meta-learners/learned-new-move.png)\n",
    " \n",
    "元学习器是一种利用现成的预测机器学习方法来解决我们迄今为止一直在研究的相同问题的简单方法：估计 CATE。同样，它们都不是最好的，每个都有其弱点。我将尝试复习它们，但请记住，这些内容高度依赖于上下文。不仅如此，元学习器还部署了预测性 ML 模型，这些模型可以从线性回归和提升决策树到神经网络和高斯过程。元学习器的成功也将在很大程度上取决于它使用哪种机器学习方法作为其组件。很多时候你只需要尝试很多不同的东西，看看什么最有效。 .."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "tags": [
     "hide-input"
    ]
   },
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "from matplotlib import pyplot as plt\n",
    "import seaborn as sns\n",
    "from nb21 import cumulative_gain, elast"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "在这里，我们将使用与之前相同的数据，重新收集投资广告电子邮件。同样，这里的目标是找出谁会更好地回复电子邮件。不过，这里有点曲折。这一次，我们将使用非随机数据来训练模型和随机数据来验证它们。处理非随机数据是一项更艰巨的任务，因为元学习器需要对数据进行去偏 **和** 估计 CATE ..."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>age</th>\n",
       "      <th>income</th>\n",
       "      <th>insurance</th>\n",
       "      <th>invested</th>\n",
       "      <th>em1</th>\n",
       "      <th>em2</th>\n",
       "      <th>em3</th>\n",
       "      <th>converted</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>44.1</td>\n",
       "      <td>5483.80</td>\n",
       "      <td>6155.29</td>\n",
       "      <td>14294.81</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>39.8</td>\n",
       "      <td>2737.92</td>\n",
       "      <td>50069.40</td>\n",
       "      <td>7468.15</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>49.0</td>\n",
       "      <td>2712.51</td>\n",
       "      <td>5707.08</td>\n",
       "      <td>5095.65</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>39.7</td>\n",
       "      <td>2326.37</td>\n",
       "      <td>15657.97</td>\n",
       "      <td>6345.20</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>35.3</td>\n",
       "      <td>2787.26</td>\n",
       "      <td>27074.44</td>\n",
       "      <td>14114.86</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    age   income  insurance  invested  em1  em2  em3  converted\n",
       "0  44.1  5483.80    6155.29  14294.81    0    0    1          0\n",
       "1  39.8  2737.92   50069.40   7468.15    1    0    0          0\n",
       "2  49.0  2712.51    5707.08   5095.65    0    0    1          1\n",
       "3  39.7  2326.37   15657.97   6345.20    0    0    0          0\n",
       "4  35.3  2787.26   27074.44  14114.86    1    1    0          0"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test = pd.read_csv(\"./data/invest_email_rnd.csv\")\n",
    "train = pd.read_csv(\"./data/invest_email_biased.csv\")\n",
    "train.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们的结果变量是转换，我们的处理是 email-1。让我们创建变量来存储这些变量以及我们将用于搜索干预效果异质性的特征 $X$。."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "y = \"converted\"\n",
    "T = \"em1\"\n",
    "X = [\"age\", \"income\", \"insurance\", \"invested\"]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## S-Learner（又名 Go-Horse Learner）\n",
    " \n",
    "我们将使用的第一个学习器是 S-Learner。这是我们能想到的最简单的学习器。我们将使用单个（因此是 S）机器学习模型 $M_s$ 来估计\n",
    " \n",
    "$\n",
    "\\mu(x) = E[Y| T, X]\n",
    "$\n",
    " \n",
    "为此，我们将简单地将干预作为一个特征包含在模型中，该模型试图预测结果 Y..."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "from lightgbm import LGBMRegressor\n",
    "\n",
    "np.random.seed(123)\n",
    "s_learner = LGBMRegressor(max_depth=3, min_child_samples=30)\n",
    "s_learner.fit(train[X+[T]], train[y]);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "然后，我们可以在不同的干预方案下做出预测。测试和控制之间的预测差异将是我们的 CATE 估计\n",
    " \n",
    "$\n",
    "\\hat{\\tau}(x)_i = M_s(X_i, T=1) - M_s(X_i, T=0)\n",
    "$\n",
    " \n",
    "如果我们把它放在图表中，这就是它的样子\n",
    " \n",
    "![img](data/img/meta-learners/s-learner.png)\n",
    " \n",
    "现在，让我们看看如何在代码中实现这个学习器。."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "s_learner_cate_train = (s_learner.predict(train[X].assign(**{T: 1})) -\n",
    "                        s_learner.predict(train[X].assign(**{T: 0})))\n",
    "\n",
    "s_learner_cate_test = test.assign(\n",
    "    cate=(s_learner.predict(test[X].assign(**{T: 1})) - # predict under treatment\n",
    "          s_learner.predict(test[X].assign(**{T: 0}))) # predict under control\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "为了评估这个模型，我们将查看测试集中的累积增益曲线。我也在绘制火车的增益曲线。由于训练是有偏差的，这条曲线不能给出模型是否良好的任何指示，但它可以指出我们是否过度拟合训练集。发生这种情况时，火车集中的曲线将非常高。如果您想看看它是什么样子，请尝试将 `max_depth` 参数从 3 替换为 20..."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "tags": [
     "hide-input"
    ]
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "gain_curve_test = cumulative_gain(s_learner_cate_test, \"cate\", y=\"converted\", t=\"em1\")\n",
    "gain_curve_train = cumulative_gain(train.assign(cate=s_learner_cate_train), \"cate\", y=\"converted\", t=\"em1\")\n",
    "plt.plot(gain_curve_test, color=\"C0\", label=\"Test\")\n",
    "plt.plot(gain_curve_train, color=\"C1\", label=\"Train\")\n",
    "plt.plot([0, 100], [0, elast(test, \"converted\", \"em1\")], linestyle=\"--\", color=\"black\", label=\"Baseline\")\n",
    "plt.legend()\n",
    "plt.title(\"S-Learner\");"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![img](data/img/meta-learners/not-great-not-terrible.jpeg)\n",
    " \n",
    "正如我们从累积增益中看到的那样，S-learner 虽然简单，但可以在此数据集上执行良好。要记住的一件事是，这种性能对于这个数据集来说是非常特殊的。根据您拥有的数据类型，S-learner 可能做得更好或更差。在实践中，我发现 S-learner 是解决任何因果关系问题的首选，主要是因为它的简单性。不仅如此，S-learner 可以处理连续处理和离散处理，而本章中的其他学习器只能处理离散处理。\n",
    " \n",
    "S-learner 的主要缺点是它倾向于使干预效果偏向于零。由于 S-learner 使用的通常是正则化机器学习模型，因此正则化会限制估计的干预效果。 Chernozhukov 等人 (2016) 使用模拟数据概述了这个问题：\n",
    " \n",
    "![img](data/img/meta-learners/zero-bias-s-learner.png)\n",
    " \n",
    "在这里，他们使用 S-learner 绘制了真实因果效应（红色轮廓）与估计因果效应 $\\tau - \\hat{\\tau}$ 之间的差异。估计的因果效应严重向下偏倚（$\\tau - \\hat{\\tau} > 0$ 大多数时候）。换句话说，真实的因果效应往往大于估计的因果效应。\n",
    " \n",
    "更糟糕的是，如果相对于其他协变量在解释结果时所起的影响而言，干预的效果非常弱，则 S-learner 可以完全丢弃干预变量。请注意，这与您选择的 ML 模型高度相关。正则化越大，问题就越大。解决这个问题的尝试是我们将看到的下一个学习器..."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## T-学习器\n",
    " \n",
    "T-learner 试图通过强制学习器首先对其进行拆分来解决完全丢弃处理的问题。我们将为每个干预变量使用一个模型，而不是使用单个模型。在二元情况下，我们只需要估计两个模型（因此得名 T）：\n",
    " \n",
    "$\n",
    "\\mu_0(x) = E[Y| T=0, X]\n",
    "$\n",
    " \n",
    "$\n",
    "\\mu_1(x) = E[Y| T=1, X]\n",
    "$\n",
    " \n",
    "然后，在预测时，我们可以对每个处理进行反事实预测，并得到 CATE，如下所示。\n",
    " \n",
    "$\n",
    "\\hat{\\tau}(x)_i = M_1(X_i) - M_0(X_i)\n",
    "$\n",
    " \n",
    "这是这个学习器的图表\n",
    " \n",
    "![img](数据/img/元学习器/t-learner.png)\n",
    "\n",
    "\n",
    "现在，关于理论已经足够了。让我们编写代码..."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "np.random.seed(123)\n",
    "\n",
    "m0 = LGBMRegressor(max_depth=2, min_child_samples=60)\n",
    "m1 = LGBMRegressor(max_depth=2, min_child_samples=60)\n",
    "\n",
<<<<<<< e022085c519423acf68e0d4c26b60d477788305d
    "# fit the propensity score model\n",
    "ps_m = LogisticRegression(solver=\"lbfgs\", penalty='none')\n",
    "ps_m.fit(train[X], train[T])\n",
    "ps_score = ps_m.predict_proba(train[X])\n",
    "\n",
    "m0.fit(train.query(f\"{T}==0\")[X], train.query(f\"{T}==0\")[y],\n",
    "       sample_weight=1/ps_m.predict_proba(train.query(f\"{T}==0\")[X])[:, 0])\n",
    "\n",
    "m1.fit(train.query(f\"{T}==1\")[X], train.query(f\"{T}==1\")[y],\n",
    "       sample_weight=1/ps_m.predict_proba(train.query(f\"{T}==1\")[X])[:, 1])\n",
=======
    "m0.fit(train.query(f\"{T}==0\")[X], train.query(f\"{T}==0\")[y])\n",
    "m1.fit(train.query(f\"{T}==1\")[X], train.query(f\"{T}==1\")[y])\n",
>>>>>>> update chapter 21 with the newest version from original author
    "\n",
    "# estimate the CATE\n",
    "t_learner_cate_train = m1.predict(train[X]) - m0.predict(train[X])\n",
    "t_learner_cate_test = test.assign(cate=m1.predict(test[X]) - m0.predict(test[X]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "tags": [
     "hide-input"
    ]
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "gain_curve_test = cumulative_gain(t_learner_cate_test, \"cate\", y=\"converted\", t=\"em1\")\n",
    "gain_curve_train = cumulative_gain(train.assign(cate=t_learner_cate_train), \"cate\", y=\"converted\", t=\"em1\")\n",
    "plt.plot(gain_curve_test, color=\"C0\", label=\"Test\")\n",
    "plt.plot(gain_curve_train, color=\"C1\", label=\"Train\")\n",
    "plt.plot([0, 100], [0, elast(test, \"converted\", \"em1\")], linestyle=\"--\", color=\"black\", label=\"Baseline\")\n",
    "plt.legend();\n",
    "plt.title(\"T-Learner\");"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "T-learner 在此数据集上也表现良好。测试性能看起来与我们使用 S-learner 获得的结果没有太大区别。或许是因为干预没有那么弱吧。此外，我们可以看到训练性能远高于测试性能。这表明模型过度拟合。之所以会发生这种情况，是因为我们只在数据的一个子集上拟合每个模型。使用较少的数据点，模型可能会学习一些噪音。\n",
    " \n",
    "T-Learner 避免了不接受弱干预变量的问题，但它仍然会受到正则化偏差的影响。考虑以下情况，取自 Kunzela 等人，2019 年。您有大量未经干预的数据，而干预过的数据很少，这在许多应用程序中都是很常见的情况，因为干预通常很昂贵。现在假设你在结果 Y 中有一些非线性，但**干预效果是恒定的**。我们可以在下图中看到发生了什么\n",
    " \n",
    "![img](data/img/meta-learners/t-learner-problem.png)\n",
    " \n",
    "在这里，由于我们干预过的观测值很少，$M_1$ 将是一个非常简单的模型（在本例中为线性模型）以避免过度拟合。 $M_0$ 会更复杂，但没关系，因为丰富的数据可以防止过度拟合。从机器学习的角度来看，这都是合理的。但是，如果我们使用这些模型来计算类别 $\\hat{\\tau}=M_1(X) - M_0(X)$，$M_1(X)$ 的线性减去 $M_0(X)$ 的非线性将导致非线性 CATE（蓝线减去红线），这是错误的，因为在这种情况下 CATE 是常数且等于 1。\n",
    " \n",
    "这里发生的是未干预数据对应的模型可以拾取非线性，但干预数据对应的模型不能，因为我们使用正则化来处理小样本。当然，您可以在该模型上使用较少的正则化，但样本量太小会导致过度拟合。似乎我们进退两难。为了解决这个问题，我们可以使用 Kunzela 等人在同一篇论文中提出的 X-learner。."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## X-学习器\n",
    " \n",
    "X-learner 比之前的 le​​arner 解释起来要复杂得多，但它的实现非常简单，所以不用担心。 X-Learner 有两个阶段和一个倾向评分模型。第一个与 T-learner 相同。首先，我们将样本分成处理过的和未处理过的，并为处理过的和对照拟合一个 ML 模型。\n",
    " \n",
    "$\n",
    "\\hat{M}_0(X) \\approx E[Y| T=0, X]\n",
    "$\n",
    " \n",
    "$\n",
    "\\hat{M}_1(X) \\approx E[Y| T=1, X]\n",
    "$\n",
    " \n",
    "现在，事情开始有了转机。对于第二阶段，我们使用上述模型输入控制和干预的效果\n",
    " \n",
    "$\n",
    "\\hat{\\tau}(X, T=0) = \\hat{M}_1(X, T=0) - Y_{T=0}\n",
    "$\n",
    " \n",
    "$\n",
    "\\hat{\\tau}(X, T=1) = Y_{T=1} - \\hat{M}_0(X, T=1)\n",
    "$\n",
    " \n",
    "然后，我们再拟合两个模型来预测这些影响\n",
    " \n",
    "$\n",
    "\\hat{M}_{\\tau 0}(X) \\approx E[\\hat{\\tau}(X)|T=0]\n",
    "$\n",
    " \n",
    "$\n",
    "\\hat{M}_{\\tau 1}(X) \\approx E[\\hat{\\tau}(X)|T=1]\n",
    "$\n",
    " \n",
    "如果我们将它应用到我们之前展示的图像上，$\\hat{\\tau}(X, T=0)$，即对未处理的估算处理效果，将是红色十字，红色虚线将是 $ \\hat{M}_{\\tau 0}(X)$。注意这个模型是错误的。因为 $\\hat{\\tau}(X, T=0)$ 是使用正则化的简单模型制作的，在经过处理的 $\\hat{M}_1$ 上进行估计。它输入的处理效果是非线性的，因为它**没有**捕获 Y 变量中的非线性。\n",
    " \n",
    "相比之下，蓝点是被干预对象的估计干预结果，$\\hat{\\tau}(X, T=1)$。这些影响是使用正确的模型 $M_0$ 估计的，该模型在未经处理的大样本中训练。因此，由于其估计的干预效果是正确的，我们能够训练出正确的第二阶段模型 $\\hat{M}_{\\tau 1}(X)$，如蓝线所示。\n",
    " \n",
    "![img](data/img/meta-learners/second-stage-x.png)\n",
    " \n",
    "所以我们有一个错误的模型，因为我们错误地输入了干预效果，而另一个模型是正确的，因为我们正确地估算了这些值。现在，我们需要一种方法将两者结合起来，从而为正确的模型赋予更多权重。.这就是倾向得分模型发挥作用的地方让 $\\hat{e}(x)$ 成为倾向得分模型，我们可以将两个第二阶段模型组合如下：\n",
    " \n",
    "$\n",
    "\\hat{\\tau(x)} = \\hat{M}_{\\tau 0}(X)(\\hat{e}(x)) + \\hat{M}_{\\tau 1}(X)( 1-\\hat{e}(x))\n",
    "$\n",
    " \n",
    "由于处理单元很少，$\\hat{e}(x)$ 非常小。这会给错误的模型 $\\hat{M}_{\\tau 0}(X)$ 一个非常小的权重。\n",
    "\n",
    "相比之下，$1-\\hat{e}(x)$ 接近于 1，因此我们会给正确的模型 $\\hat{M}_{\\tau 1}(X)$ 赋予较高的权重。更广义的情况下，使用倾向得分的加权平均数将确保我们为估计更有可能得到进行干预的 CATE 模型赋予更多权重。换句话说，我们会偏爱使用更多数据训练的模型。下图显示了 X-learner 和 T-learner 给出的估计 CATE。\n",
    " \n",
    "![img](data/img/meta-learners/t-vs-x-learner.png)\n",
    " \n",
    "正如我们所看到的，与 T-learner 相比，X-learner 在纠正非线性估计的错误 CATE 方面做得更好。一般来说，当一个干预组比另一个大得多时，X-learner 表现更好。\n",
    " \n",
    "我知道这可能有点啰嗦，但希望一旦我们开始实施，它就会变得清晰。为了总结一切，这里是这个学习器的图表。\n",
    " \n",
    "![img](data/img/meta-learners/x-learner.png)\n",
    " \n",
    "最后到代码！首先，我们有第一阶段，它与 T-Learner 完全相同。 .."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.linear_model import LogisticRegression\n",
    "\n",
    "np.random.seed(123)\n",
    "\n",
    "# first stage models\n",
    "m0 = LGBMRegressor(max_depth=2, min_child_samples=30)\n",
    "m1 = LGBMRegressor(max_depth=2, min_child_samples=30)\n",
    "\n",
    "# propensity score model\n",
    "g = LogisticRegression(solver=\"lbfgs\", penalty='none') \n",
    "\n",
    "m0.fit(train.query(f\"{T}==0\")[X], train.query(f\"{T}==0\")[y])\n",
    "m1.fit(train.query(f\"{T}==1\")[X], train.query(f\"{T}==1\")[y])\n",
    "                       \n",
    "g.fit(train[X], train[T]);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "现在，我们估算干预效果并在其上拟合第二阶段模型。 .."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "d_train = np.where(train[T]==0,\n",
    "                   m1.predict(train[X]) - train[y],\n",
    "                   train[y] - m0.predict(train[X]))\n",
    "\n",
    "# second stage\n",
    "mx0 = LGBMRegressor(max_depth=2, min_child_samples=30)\n",
    "mx1 = LGBMRegressor(max_depth=2, min_child_samples=30)\n",
    "\n",
    "mx0.fit(train.query(f\"{T}==0\")[X], d_train[train[T]==0])\n",
    "mx1.fit(train.query(f\"{T}==1\")[X], d_train[train[T]==1]);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "最后，我们使用倾向评分模型进行修正预测。 .."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "def ps_predict(df, t): \n",
    "    return g.predict_proba(df[X])[:, t]\n",
    "    \n",
    "    \n",
    "x_cate_train = (ps_predict(train,0)*mx0.predict(train[X]) +\n",
    "                ps_predict(train,1)*mx1.predict(train[X]))\n",
    "\n",
    "x_cate_test = test.assign(cate=(ps_predict(test,0)*mx0.predict(test[X]) +\n",
    "                                ps_predict(test,1)*mx1.predict(test[X])))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "让我们看看我们的 X-Learner 在测试中的表现如何。我们再次绘制累积增益曲线。 .."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "tags": [
     "hide-input"
    ]
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "gain_curve_test = cumulative_gain(x_cate_test, \"cate\", y=\"converted\", t=\"em1\")\n",
    "gain_curve_train = cumulative_gain(train.assign(cate=x_cate_train), \"cate\", y=\"converted\", t=\"em1\")\n",
    "plt.plot(gain_curve_test, color=\"C0\", label=\"Test\")\n",
    "plt.plot(gain_curve_train, color=\"C1\", label=\"Train\")\n",
    "plt.plot([0, 100], [0, elast(test, \"converted\", \"em1\")], linestyle=\"--\", color=\"black\", label=\"Baseline\")\n",
    "plt.legend();\n",
    "plt.title(\"X-Learner\");"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "我们在这个数据集上的表现仍然是还不错的。S、T 和 X 学习器在这里的表现似乎非常相似。不过，我认为了解所有这些元学习器还是值得的，这样你就可以使用最适合你的东西。请记住，性能也高度依赖于我们选择的基础机器学习模型。在这里，我们使用 Gradient Boosted Trees 完成了所有工作，但也许其他方法甚至具有不同超参数的相同方法可能效果更好。\n",
    " \n",
    "## 关键思想\n",
    " \n",
    "同样，我们能做的最简单的事情就是使用单个或 S-learner，并将处理作为一个特征。当干预不是结果的弱预测指标时，这往往很有效。但如果情况并非如此，S-learner 往往会偏向于零，甚至完全放弃干预。增加一点复杂性，我们可以使用 T-learner 强制学习器接受干预。在这里，我们为每个干预的水平设置一个机器学习模型。当所有干预水平都有足够的样本时，此方法工作正常，但当一个干预水平的样本量较小时，它可能会失败，从而迫使模型被高度正则化。为了解决这个问题，我们可以使用 X-learner 增加另一层复杂性，其中我们有两个拟合阶段，我们使用倾向得分模型来纠正用很少的数据点估计的模型的潜在错误。\n",
    " \n",
    "这些学习器（S-学习器除外）的一个大问题是他们假设二元或分类处理。还有一种我们还没有见过的更通用的学习器：R 学习器。但别担心，我们将有一整章专门介绍它。"
   ]
  }
 ],
 "metadata": {
  "celltoolbar": "Tags",
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
<<<<<<< e022085c519423acf68e0d4c26b60d477788305d
   "version": "3.8.5"
=======
   "version": "3.7.15"
>>>>>>> update chapter 21 with the newest version from original author
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
